package object;

import java.util.Objects;

class TestClass {
    int num;
    String name;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        TestClass testClass = (TestClass) o;
        return num == testClass.num && Objects.equals(name, testClass.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(num, name);
    }

    public TestClass(int num, String name) {
        this.num = num;
        this.name = name;
    }

}

public class Test {
    //java中 Object 类是所有类的父类
    //所有类都可以用 Object 统一接收
    //所以在开发中 Object 类是参数的最高统一类型

    //重写Object 中的 equals 与 hashCode
    public static void main(String[] args) {
        TestClass a = new TestClass(10, "王");
        TestClass b = new TestClass(10, "王");
        System.out.println(a.equals(b));//false
        //a和b中的成员都是一样的咋还不相等呢?
        //这是因为Object 中实现的equals只是比较了两对象的引用 而引用是实例对象地址的哈希值
        //只要不是同一个地址哈希值就会是不一样的
        /*
         * public boolean equals(Object obj) {
         *         return (this == obj);
         *     }
         */
        //这种情况我们就要考虑重写 Object 中的 equals 了
        //重写之后就得到了我们想要的结果啦

        //但有时我们又想当我们实例了两个一模一样的对象时他们的哈希值是一样的就好了

        //这时我们可以重新 Object 中的 hashCode
        System.out.println(a);//object.TestClass@7882
        System.out.println(b);//object.TestClass@7882

    }
}
